package com.example.rabbitmq.demo1_modes.consumer.mode03_sub;
import com.example.rabbitmq.enums.ExchangeEnum;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

import java.io.IOException;

/**
 * @Author songyahui
 * @Date 2023/7/7 21:41
 * @Description
 */
public class Consumer01 {

    public static void consumeMessageWithSubModeAndFanoutType(Channel channel) throws IOException {
        //声明一个交换机
        channel.exchangeDeclare(ExchangeEnum.LOGS.name, BuiltinExchangeType.FANOUT);

        //声明一个临时队列
        /*
         *
         * 生成一个临时的队列、队列的名称是随机的
         * 当消费者断开与队列的连接的时候, 队列就自动删除了
         * */
        String queueName = channel.queueDeclare().getQueue();

        //绑定交换机
        /*
         * 参数一: 队列名称
         * 参数二: 交换机名称
         * 参数三: 路由key
         * */
        channel.queueBind(queueName,ExchangeEnum.LOGS.name,"");

        System.out.println("C1等待接收消息");
        //接收消息

        DeliverCallback deliverCallback = (consumerTag,message)-> {
            System.out.println("C1成功接收到消息: " + new String(message.getBody()));
            /*
             * 消息手动应答
             * */
            channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
        };

        //消费者取消订阅时触发
        CancelCallback cancelCallback = consumerTag -> {
            System.out.println("C1接收失败的消息的队列标记值: " + consumerTag);
        };

        /*
         *
         * 参数一: 队列名称
         * 参数二: 是否自动应答
         * 参数三: 成功确认消息回调函数
         * 参数四: 失败消息回调函数
         * */
        boolean autoAck = false;
        channel.basicConsume(queueName,autoAck,deliverCallback,cancelCallback);
    }

}

